home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / t_os / tool / helper / src / control / helper.asm next >
Encoding:
Assembly Source File  |  1994-11-16  |  4.3 KB  |  280 lines

  1. ;
  2. ;    helper control program
  3. ;
  4. ;    1994.07.04    remake by K.Miyazaki
  5. ;
  6.         .386p
  7. code        segment    byte public use16 'CODE'
  8. code        ends
  9.  
  10. code        segment
  11.         assume    cs:code,ds:code,es:code,ss:nothing
  12.  
  13. CTRL_INT    equ    0D9h
  14.  
  15.         org    02ch
  16. EnvSeg        label    word
  17.  
  18.         org    05Ch
  19. Exe_fcb1    label    byte
  20.  
  21.         org    06Ch
  22. Exe_fcb2    label    byte
  23.  
  24.         org    080h
  25. CmdsLine    label    byte
  26.  
  27.         org    100h
  28. entry:        jmp    main
  29.  
  30. Exe_Param    dw    ?        ; Envp Seg    +0
  31.         dw    offset Pam_line    ; para offset    +2
  32.         dw    ?        ;      seg    +4
  33.         dw    offset Exe_fcb1    ; FCB1 offset    +6
  34.         dw    ?        ;      seg    +8
  35.         dw    offset Exe_fcb2    ; FCB2 offset    +10
  36.         dw    ?        ;      seg    +12
  37.  
  38. Def_Cmd        db    'Q:\RUN386.EXE',0
  39. Def_Param    db    26
  40.         db    '-nocrtreset '
  41. Def_Exp        db    'Q:\HELPER.EXP '
  42. Def_ExpPara    db    0Dh
  43.         db    100 dup (0)
  44.  
  45. Pam_line    db    128 dup (0)
  46.  
  47. Menu_Mark    db    1,2,3,4
  48. Menu_Work    db    123 dup (0)    ; M_MENU用のワ-クエリア
  49. Boot_Drv    db    0        ; 起動したドライブNo.
  50. Cmd_code    dw    0        ; コマンドコード(INPUT)
  51. Cmd_stat    dw    0        ; エラーレベル  (OUTPUT)
  52. Dos_errno    dw    0        ; INT21(#4B)時に返されるAXの値(OUTPUT)
  53. Dev_code    dw    0        ; INT24時に渡されるAXの値(OUTPUT)
  54. Err_code    dw    0        ; INT24時に渡されるDIの値(OUTPUT)
  55. Cmd_line    db    128 dup (0)
  56.  
  57. Ctrl_Vect    dd    far
  58. Abort_Vect    dd    far
  59.  
  60. exec        proc    near
  61.         mov    si, offset Cmd_line
  62.         cld
  63.  
  64. exec_0:        mov    al,[si]
  65.         cmp    al,' '
  66.         je    exec_01
  67.         cmp    al,09h
  68.         jne    exec_1
  69. exec_01:    inc    si
  70.         jmp    exec_0
  71.  
  72. exec_1:        mov    al,[si]
  73.         cmp    al,0
  74.         je    exec_3
  75.         cmp    al,' '
  76.         je    exec_2
  77.         cmp    al,09h
  78.         je    exec_2
  79.         cmp    al,0Dh
  80.         je    exec_2
  81.         inc    si
  82.         jmp    exec_1
  83.  
  84. exec_2:        mov    byte ptr [si], 0
  85.         inc    si
  86.  
  87. exec_3:        mov    di, offset Pam_line + 1
  88.         mov    ah,0
  89.  
  90. exec_4:        mov    al,[si]
  91.         cmp    al,0
  92.         je    exec_5
  93.         cmp    al,0Dh
  94.         je    exec_5
  95.         movsb
  96.         inc    ah
  97.         jmp    exec_4
  98.  
  99. exec_5:        mov    Pam_line,ah
  100.         mov    byte ptr [di], 0Dh
  101.         mov    byte ptr [di + 1], 0
  102.  
  103.         mov    di,offset Exe_Param
  104.         mov    word ptr [di+2],offset Pam_line
  105.  
  106.         mov    si,offset Pam_line + 1
  107.         mov    di,offset Exe_fcb1
  108.         mov    ax,2901h
  109.         int    21h
  110.         mov    di,offset Exe_fcb2
  111.         mov    ax,2901h
  112.         int    21h
  113.  
  114.         mov    Dos_errno,0
  115.         mov    Dev_code,0
  116.         mov    Err_code,0
  117.  
  118.         mov    dx,offset Cmd_line
  119.         mov    bx,offset Exe_Param
  120.         mov    ax,4B00h
  121.         int    21h
  122.         jnc    exec_6
  123.         mov    Dos_errno,ax
  124.         ret
  125.  
  126. exec_6:        mov    ah,4Dh
  127.         int    21h
  128.         mov    Cmd_stat,ax
  129.         ret
  130.  
  131. exec        endp
  132.  
  133. menu        proc    near
  134.         mov    ah,0Eh
  135.         mov    dl,Boot_Drv
  136.         int    21h
  137.  
  138.         mov    di,offset Exe_Param
  139.         mov    word ptr [di+2],offset Def_Param
  140.  
  141.         mov    si,offset Def_Exp
  142.         mov    di,offset Exe_fcb1
  143.         mov    ax,2901h
  144.         int    21h
  145.         mov    di,offset Exe_fcb2
  146.         mov    ax,2901h
  147.         int    21h
  148.  
  149.         mov    dx,offset Def_Cmd
  150.         mov    bx,offset Exe_Param
  151.         mov    ax,4B00h
  152.         int    21h
  153.         ret        
  154.  
  155. menu        endp
  156.  
  157. Ctrl_Trap    proc    far
  158.         push    cs
  159.         pop    es
  160.         mov    bx,cs
  161.         shl    ebx,16
  162.         mov    bx,offset Cmd_code
  163.         iret
  164. Ctrl_Trap    endp
  165.  
  166. Abort_Trap    proc    far
  167.         mov    cs:Dev_code,ax
  168.         mov    cs:Dev_code,di
  169.         mov    al,3
  170.         iret
  171. Abort_Trap    endp
  172.  
  173. main        proc    near
  174.         mov    ax,cs
  175.         mov    ds,ax
  176.         mov    es,ax
  177.  
  178.         mov    sp,offset Local_Stack        ; Stack Init
  179.  
  180.         mov    bx,offset End_of_Prog
  181.         add    bx,15
  182.         shr    bx,4
  183.         mov    ah,4Ah
  184.         int    21h                ; Memory resize
  185.  
  186.         mov    ah,19h
  187.         int    21h
  188.         mov    Boot_Drv,al
  189.  
  190.         add    al,'A'
  191.         mov    Def_Cmd,al
  192.         mov    Def_Exp,al
  193.  
  194.         mov    di,offset Exe_Param
  195.         mov    ax,EnvSeg
  196.         mov    [di+0],ax
  197.         mov    ax,ds
  198.         mov    [di+4],ax
  199.         mov    [di+8],ax
  200.         mov    [di+12],ax
  201.  
  202.         push    es
  203.         mov    ah,35h
  204.         mov    al,CTRL_INT
  205.         int    21h
  206.         mov    word ptr Ctrl_Vect,bx
  207.         mov    ax,es
  208.         mov    word ptr Ctrl_Vect + 2,ax
  209.         pop    es
  210.  
  211.         mov    dx,offset Ctrl_Trap
  212.         mov    ah,25h
  213.         mov    al,CTRL_INT
  214.         int    21h
  215.  
  216.         push    es
  217.         mov    ax,3524h
  218.         int    21h
  219.         mov    word ptr Abort_Vect,bx
  220.         mov    ax,es
  221.         mov    word ptr Abort_Vect + 2,ax
  222.         pop    es
  223.  
  224.         mov    dx,offset Abort_Trap
  225.         mov    ax,2524h
  226.         int    21h
  227.  
  228.         cld
  229.         mov    si,offset CmdsLine
  230.         mov    di,offset Def_ExpPara
  231.         lodsb
  232. main_ex_1:    cmp    al,0
  233.         je    main_ex_2
  234.         mov    ah,byte ptr [si]
  235.         cmp    ah,0
  236.         je    main_ex_2
  237.         cmp    ah,0Dh
  238.         je    main_ex_2
  239.         movsb
  240.         inc    Def_Param
  241.         dec    al
  242.         jmp    main_ex_1
  243.  
  244. main_ex_2:    mov    ah,0Dh
  245.         mov    byte ptr [di], ah
  246.  
  247. main_1:        cmp    Cmd_code,0
  248.         je    main_2
  249.         cmp    Cmd_code,0FFh
  250.         je    main_end
  251.         call    exec
  252.         mov    Cmd_code,0
  253. main_2:        call    menu
  254.         jnc    main_1
  255.  
  256. main_end:    push    ds
  257.         lds    dx,Ctrl_Vect
  258.         mov    ah,25h
  259.         mov    al,CTRL_INT
  260.         int    21h
  261.         pop    ds
  262.  
  263.         push    ds
  264.         lds    dx,Abort_Vect
  265.         mov    ax,2524h
  266.         int    21h
  267.         pop    ds
  268.  
  269.         mov    ax,4C00h            ; End of Prog
  270.         int    21h
  271.  
  272. main        endp
  273.  
  274.         db    256 dup (?)
  275. Local_Stack    label    word
  276. End_of_Prog    label    word
  277.  
  278. code        ends
  279.         end    entry
  280.